# Table of Contents

# Broadcast Intent, Broadcast Receiver

브로드캐스트 인탠트(Broadcast Intent)브로드캐스트 리시버(Broadcast Receiver)를 사용하면 시스템의 다른 컴포넌트들에게 시스템 차원의 메시지를 전송할 수 있습니다.

예제를 통해 브로드캐스트 인탠트(Broadcast Intent)브로드캐스트 리시버(Broadcast Receiver)에 대해 알아보겠습니다. 아래와 같이 두 개의 프로젝트를 생성합니다.

  • broadcast_sender
  • broadcast_receiver

# broadcast_sender

broadcast_sender 프로젝트는 브로드캐스트 인텐트를 생성하여 안드로이드 시스템에 전달합니다. 레이아웃은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/activity_main_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Broadcast"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

화면은 다음과 같습니다.

코드는 다음과 같습니다. 버튼을 누르면 브로드캐스트 인텐트를 생성하여 시스템에 전송합니다. 이때 sendBroadcast()메소드를 사용합니다.

class MainActivity : AppCompatActivity() {

    val button: Button by lazy { findViewById<Button>(R.id.activity_main_button) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            // 인텐트 생성
            val intent = Intent()
            // 액션 설정
            intent.action = "com.yologger.broadcast_sender"
            // 데이터 추가
            intent.putExtra("name", "Paul")
            // 브로드케스트 인텐트 전송
            sendBroadcast(intent)
        }
    }
}

# broadcast_receiver

broadcast_receiver 프로젝트는 브로드캐스트 인텐트를 수신합니다. 브로드캐스트 인텐트를 수신하려면 BroadcastReceiver클래스를 구현하고 onReceive()메소드를 오버라이딩 해야합니다. 아래 코드는 브로드케스트 인텐트를 수신하면 토스트 메시지를 출력합니다.

class CustomBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        intent.action?.run {
            intent?.extras?.getString("name").run {
                Toast.makeText(context, "$this", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

이제 MainActivity.kt에서 브로드캐스트 리시버를 등록합니다. 브로드캐스트 리시버를 등록할 때는 registerReceiver()메소드를 사용합니다. onDestroy()에서는 unregisterReceiver()메소드를 호출하여 브로드캐스트 리시버를 해제해야합니다.

class MainActivity : AppCompatActivity() {

    lateinit var customBroadcastReceiver: CustomBroadcastReceiver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        customBroadcastReceiver = CustomBroadcastReceiver()

        var intentFilter = IntentFilter()
        intentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED)
        intentFilter.addAction(Intent.ACTION_POWER_CONNECTED)
        intentFilter.addAction("com.yologger.broadcast_sender")

        registerReceiver(customBroadcastReceiver, intentFilter)
    }

    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(customBroadcastReceiver)
    }
}

이제 두 앱을 설치하고 broadcast-receiver 앱을 실행합니다. 이후 broadcast-sender 앱을 실행하고 버튼을 누르면 다음과 같이 토스트 매시지가 출력됩니다.

# 시스템 브로드캐스트 인텐트

안드로이드 시스템은 전원 연결, 전원 해제, 네트워크 상태 변경 등 특정 이벤트가 발생하면 브로드캐스트 인텐트를 전송합니다. 우리는 이 시스템 브로드캐스트 인텐트도 수신할 수 있습니다. 아래 코드는 전원이 연결되었을 때, 전원이 해제되었을 때 시스템 인텐트를 수신하는 예제입니다.

class CustomBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        intent.action?.run {
            when(this) {
                // 전원이 연결되었을 때
                Intent.ACTION_POWER_CONNECTED -> {
                    Toast.makeText(context, "ACTION POWER CONNECTED", Toast.LENGTH_SHORT).show()
                }
                // 전원이 해제되었을 때
                Intent.ACTION_POWER_DISCONNECTED -> {
                    Toast.makeText(context, "ACTION POWER DISCONNECTED", Toast.LENGTH_SHORT).show()
                }
                else -> {
                    intent?.extras?.getString("name").run {
                        Toast.makeText(context, "$this", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }
    }
}

이제 휴대폰에 전원코드를 꼽았다 빼면 아래와 같이 토스트 메시지가 출력됩니다.